[Update] ทดลอง Deploy PHP ใน Elastic Beanstalk และเชื่อมต่อกับ RDS
สวัสดีครับ POP จากบริษัท Classmethod (Thailand) ครับ
ครั้งนี้จะมาแนะนำเกี่ยวกับวิธีการ Deploy PHP ใน Elastic Beanstalk และเชื่อมต่อกับ RDS แล้ว Insert ข้อมูลลงใน Database เพื่อให้ข้อมูลแสดงบนหน้าเว็บไซต์แบบเรียลไทม์ครับ
นอกจากนี้การอัปเดตและแก้ไขโปรเจกต์ที่ได้ Deploy ไปแล้วก็เป็นส่วนสำคัญ เพราะเมื่อโปรเจกต์มีการอัปเดต ก็จำเป็นต้อง Deploy โปรเจกต์เป็นเวอร์ชันใหม่ใน Elastic Beanstalk ดังนั้นเราก็จะมาอธิบายในส่วนนี้ด้วยครับ
เป้าหมาย
- สร้าง Application และ Environment ใน Elastic Beanstalk
- Deploy PHP ด้วย Environments โดยใช้ Platform PHP
- เชื่อมต่อไปยัง RDS ผ่าน Instance ในโปรแกรม PuTTY
- Insert ข้อมูลลงใน Database ของ RDS
- สร้างโปรแกรมที่ใช้ในการแสดงข้อมูล MySQL
- ทดสอบการแสดงข้อมูลบนหน้าเว็บไซต์แบบเรียลไทม์
- Update Application versions
สร้าง Resources ที่จำเป็นสำหรับ Elastic Beanstalk
- สร้าง Service role และ Instance profile ที่ใช้สำหรับ Elastic Beanstalk ใน IAM
- สร้าง Key Pair สำหรับ Elastic Beanstalk
- สร้าง Security Group สำหรับ Elastic Beanstalk
สร้าง Service role และ Instance profile ที่ใช้สำหรับ Elastic Beanstalk ใน IAM
ก่อนสร้าง Environment จำเป็นต้องสร้าง Service role และ Instance profile ใน IAM Role เตรียมไว้ โดยแนะนำให้กำหนดชื่อและ Permissions ตาม Documentation ของ AWS ดังนี้
IAM Role Name | Permissions |
---|---|
aws-elasticbeanstalk-service-role | AWSElasticBeanstalkEnhancedHealth |
AWSElasticBeanstalkService | |
aws-elasticbeanstalk-ec2-role | AWSElasticBeanstalkWebTier |
AWSElasticBeanstalkWorkerTier | |
AWSElasticBeanstalkMulticontainerDocker |
ดูตัวอย่างได้ที่ลิงก์ด้านล่างนี้
สร้าง Key Pair สำหรับ Elastic Beanstalk
ดูตัวอย่างที่นี่เฉพาะหัวข้อนี้: การสร้าง Key Pair
ตัวอย่างตั้งค่าการสร้าง Key Pairs
※Create Key pair
Name:tinnakorn-test-eb
Private key file format:.ppk
สร้าง Security Group สำหรับ Elastic Beanstalk
ครั้งนี้จะสร้าง Security Group โดยใช้ชื่อว่า tinnakorn-test-eb
เข้ามาที่ Service Amazon EC2 แล้วคลิก Security Groups
จากเมนูด้านซ้ายในหัวข้อ "▼ Network & Security"
แล้วตั้งค่า Basic details
・Security group name: tinnakorn-test-eb
(ป้อนชื่อตามต้องการ)
・Description: tinnakorn-test-eb
(ป้อนตามต้องการ)
จากนั้นเลื่อนลงมาด้านล่างสุด แล้วคลิก Create security group
เมื่อสร้าง Key Pair, Security Groups และ IAM Role (Service role, Instance profile) สำหรับ Elastic Beanstalk เสร็จแล้ว ให้ทำขั้นตอนถัดไปได้เลยครับ
สร้าง RDS
เราสามารถใช้ RDS เป็น Engine type ที่ต้องการได้ แต่ครั้งนี้จะสร้าง RDS เป็น Engine type MySQL
เพื่อใช้เชื่อมต่อกับ Instance ที่ถูกสร้างจาก Elastic Beanstalk
ให้สร้าง RDS ตามลิงก์ด้านล่างนี้ (ทำเฉพาะหัวข้อที่ระบุไว้ด้านล่างนี้เท่านั้น เพราะเป็นการเชื่อมต่อกับ Instance ที่ถูกสร้างจาก Elastic Beanstalk)
ตัวอย่างตั้งค่าการสร้าง RDS (MySQL)
※สร้าง Security Group สำหรับ RDS (MySQL)
Basic details
Security group name:tinnakorn-test-rds
(ตั้งชื่อที่ต้องการ)
Description:tinnakorn-test-rds
(ป้อนตามต้องการ)Inbound rules
Type:MYSQL/Aurora
| Source:Custom
|tinnakorn-test-eb
(เลือก Security Group ที่ต้องการให้เชื่อมต่อเข้ามา ครั้งนี้คือ tinnakorn-test-eb)※สร้าง RDS (MySQL)
Choose a database creation method◎ Standard create
Engine options
Engine type:MySQL
Edition:MySQL Community
Engine Version:MySQL 8.0.35
Templates
◎ Production
Availability and durability
Deployment options:Single DB instance
Settings
DB instance identifier:tinnakorn-test-rds
▼ Credentials Settings
Master username:admin
Master password:PassW0rd
(รหัสผ่านนี้เป็นแค่ตัวอย่าง ให้กำหนดรหัสผ่านที่ต้องการ)
Confirm master password:PassW0rd
Instance configuration
DB instance class:◎ Burstable classes (includes t classes)
db.t3.micro
Storage
Storage type:General Purpose SSD (gp2)
Allocated storage:20
▼ Storage autoscaling✅ Enable storage autoscaling
Connectivity
Existing VPC security groups: ✅ tinnakorn-test-rds (เลือก Security Group ที่สร้างสำหรับ RDS (MySQL))
การสร้าง RDS เสร็จเรียบร้อยแล้ว ทำขั้นตอนถัดไปได้เลยครับ
เตรียมไฟล์สำหรับใช้ Deploy ใน Elastic Beanstalk
สร้างไฟล์ info.php
บนอุปกรณ์ของเราเตรียมไว้ใช้ Upload ใน Elastic Beanstalk
สร้างไฟล์ info.php
เราสามารถใช้โปรแกรมอะไรก็ได้ในการสร้างไฟล์ info.php
บนอุปกรณ์ของเรา แต่ครั้งนี้จะสร้างใน Notepad บน Windows
เปิด Notepad ขึ้นมา แล้วคัดลอก Code ด้านล่างนี้วางลงที่นี่
<?php phpinfo();
เราจะ Save ไฟล์ไว้ที่ไหนก็ได้ แต่ในตัวอย่างนี้คือ
・เลือก Desktop
・File name: info.php
(แนะนำให้ตั้งชื่อไฟล์ตามนี้สำหรับการทดสอบ)
・Save as type: All files (*.*)
・Encoding: UTF-8
・คลิก Save
Compress to ZIP file
จากนั้นปิด Notepad ไปได้เลย แล้วคลิกขวาที่ไฟล์ info.php
และเลือก Compress to ZIP file
เพื่อบีบอัดไฟล์
แล้วไฟล์ ZIP จะแสดงไอคอนชื่อ info.zip
แบบนี้ (สำหรับคนที่ใช้ WinRAR หรือโปรแกรมแตกไฟล์อื่นๆ จะแสดงไอคอนตามโปรแกรมที่เราใช้งาน)
แล้วเปลี่ยนชื่อไฟล์ "info.zip" เป็นวันที่และเวลาปัจจุบันเพื่อให้ง่ายต่อการดู Application versions เช่น 20240308_1450.zip
แล้วคลิกเข้ามาก็จะแสดงไฟล์แบบนี้
สร้าง Application ใน Elastic Beanstalk
ค้นหาและเลือก Elastic Beanstalk
เลือก Applications
จากเมนูด้านซ้าย
คลิก Create application
ด้านขวา
หัวข้อ Application information
・Application name: tinnakorn-test-eb
(ป้อนชื่อที่ต้องการ)
แล้วคลิก Create
สร้าง Environment ใน Elastic Beanstalk
สร้าง Environment เพื่อใช้สำหรับการ Deploy ไฟล์ PHP
คลิก Create a new environment
ใน Application ของเรา
Step 1: Configure environment
หัวข้อ Environment tier
・Web server environment
(ค่าเริ่มต้น)
หัวข้อ Environment information
ป้อนชื่อที่ต้องการ แต่ตัวอย่างนี้จะใช้ชื่อตามที่ระบบจัดการให้
・Environment name: Tinnakorn-test-eb-env
(ค่าเริ่มต้น)
・Domain: Tinnakorn-test-eb-env
・คลิก Check availability
(ต้องแสดง ✅ [Domain Elastic Beanstalk] is available
แบบนี้)
หัวข้อ Platform
AWS Elastic Beanstalk มี Platform ที่รองรับดังนี้:
- .NET Core on Linux
- .NET on Windows Server
- Docker
- Go
- Java
- Node.js
- PHP
- Python
- Ruby
- Tomcat
การตั้งค่าหัวข้อ Platform คือ
・Platform: PHP
・Platform branch: ระบบเลือกให้อัตโนมัติ
・Platform version: ระบบเลือกให้อัตโนมัติ (มีการอัปเดตเวอร์ชันใหม่เรื่อยๆ แนะนำให้ใช้เวอร์ชันที่มี (Recommended)
)
หัวข้อ Application code
・เลือก Upload your code
・เลือก Local file
・คลิก Choose file
แล้วเลือกไฟล์จากที่เก็บไฟล์ของเรา ครั้งนี้ไฟล์ ZIP อยู่ใน Desktop แล้วคลิก Open
แล้วจะแสดง [✅ File name: 20240308_1450.zip] แบบนี้
จากนั้นป้อนชื่อเวอร์ชันในช่อง Version label เช่น 20240308_1450
(แนะนำให้ป้อนเป็นชื่อเดียวกับไฟล์ ZIP ที่บีบอัดไว้ก่อนหน้านี้)
หัวข้อ Presets จะใช้เป็นค่าเริ่มต้น เมื่อตั้งค่าหน้านี้เสร็จแล้ว คลิก Next
Step 2: Configure service access
หัวข้อ Service access
・Service role: Use an existing service role
・Existing service roles: aws-elasticbeanstalk-service-role
(ระบบเลือกให้ตามที่สร้างตอนแรก)
・EC2 key pair: tinnakorn-test-eb
(Key Pair ที่สร้างก่อนหน้านี้)
・EC2 instance profile: aws-elasticbeanstalk-ec2-role
(ระบบเลือกให้ตามที่สร้างตอนแรก)
・คลิก Next
หมายเหตุ: หากไม่สร้าง IAM Role สำหรับ
Service role
และEC2 instance profile
เตรียมไว้ ระบบจะไม่เลือกให้อัตโนมัติ
Step 3 - optional: Set up networking, database, and tags
Step นี้ระบุว่า "optional" จึงไม่จำเป็นต้องตั้งค่าอะไร เพราะเป็นการทดสอบการใช้งาน ให้คลิก Next
ได้เลย
Step 4 - optional: Configure instance traffic and scaling
Step นี้ระบุว่า "optional" แต่จะตั้งค่าเพิ่มเติมดังนี้
หัวข้อ Instances
Root volume (boot device):
・Root volume type: General Purpose (SSD)
・Size: 10
GB (ขั้นต่ำคือ 10 GB)
แล้วเลือก EC2 security groups สำหรับ Elastic Beanstalk ที่สร้างในตอนแรก เช่น tinnakorn-test-eb
หัวข้อ Capacity
・Instance types: t3a.nano
Step 5 - optional: Configure updates, monitoring, and logging
Step นี้ระบุว่า "optional" แต่จะตั้งค่าเพิ่มเติมดังนี้
หัวข้อ Managed platform updates
・Managed updates: ▢ Activated
(ติ๊ก ✅ ออกเพื่อไม่ให้อัปเดต)
แล้วคลิก Next
ด้านล่างสุด
หากต้องการอัปเดต OS โดยอัตโนมัติ ให้ติ๊ก ✅ และเมื่อมีการอัปเดต Instance จะรีสตาร์ทโดยอัตโนมัติ ซึ่งการรีสตาร์ท Instance หรือการอัปเดต OS อาจทำให้เกิดปัญหา เช่น บริการหยุดทำงานระหว่างการดำเนินการ แล้วในกรณีที่ติ๊ก ✅ นี้ จำเป็นต้องยืนยันว่าบริการยังทำงานตามปกติระหว่างการดำเนินการหรือไม่ หากมีความกังวล เราขอแนะนำว่าไม่ต้องไปติ๊ก ✅ ครับ
Step 6: Review
ตรวจสอบการตั้งค่าตั้งแต่ "Step 1 - Step 5" แล้วคลิก Submit
ด้านล่างสุด แล้วรอสักครู่
ตรวจสอบหน้าเว็บไซต์
ระหว่างที่ระบบกำลังเริ่มต้นจะมีสถานะเป็น [Unknown
→ Pending
→ OK
]
เมื่อระบบเริ่มต้นเสร็จแล้วจะแสดงหน้าจอแบบนี้ โดยมี Running version เป็นชื่อตามที่ป้อนตอนอัปโหลดไฟล์ ZIP และมี Domain ที่เป็นลิงก์สำหรับแสดงผลหน้าไซต์ ทีนี้ให้คลิกลิงก์ Domain
เพื่อตรวจสอบหน้าเว็บไซต์ได้เลย
แล้วจะแสดงหน้าจอ 403 Forbidden แบบนี้
ต่อไปให้เพิ่ม path ชื่อไฟล์ /info.php
ต่อท้ายลิงก์ที่คลิกจากหน้า Environments ตามตัวอย่างด้านล่างนี้
http://[Domain Elastic Beanstalk]/info.php
ถ้าแสดงหน้าจอแบบนี้ การ Deploy PHP ไฟล์ info.php
ก็เสร็จสมบูรณ์
เชื่อมต่อกับ Instance ที่สร้างด้วย Elastic Beanstalk จาก PuTTY
สิ่งที่จะทำในขั้นตอนนี้คือ:
- ตรวจสอบ Instance ID จาก Health
- ตรวจสอบ IP Address จาก EC2
- เชื่อมต่อกับ Instance ที่สร้างด้วย Elastic Beanstalk จาก PuTTY
- ตรวจสอบไฟล์ PHP ที่อัปโหลดใน Elastic Beanstalk
ตรวจสอบ Instance ID จาก Health
ดูตัวอย่างที่นี่เฉพาะหัวข้อย่อยนี้: ตรวจสอบ Instance ID จาก Health
ตรวจสอบ IP Address จาก EC2
ดูตัวอย่างที่นี่เฉพาะหัวข้อย่อยนี้: ตรวจสอบ IP Address จาก EC2
เชื่อมต่อกับ Instance ที่สร้างด้วย Elastic Beanstalk จาก PuTTY
ตั้งค่าการเชื่อมต่อกับ Instance ในโปรแกรม PuTTY ตามด้านล่างนี้
ดูตัวอย่างที่นี่: การเชื่อมต่อกับ EC2 Instance ด้วย PuTTY
・Session
Host Name:Your Public IPv4 address
(IPv4 address ของ Instance)
Saved Sessions:tinnakorn-test-eb
(ป้อนชื่อที่ต้องการ)・Connection
Seconds between keepalives (0 to turn off):60
・Connection → Data
Auto-login username:ec2-user
(บังคับให้ใส่ตามนี้เพราะ AMI เป็น Amazon Linux)・Connection → SSH → Auth → Credentials
Private key file for authentication → Private key file for authentication:
คลิกBrowse...
และเลือกyour_key_pair.ppk
(เช่นtinnakorn-test-eb.ppk
)・Session (กลับมาที่หัวข้อนี้อีกครั้ง)
Saved Sessions:your_session_name
(เช่นtinnakorn-test-eb
แล้วคลิกSave
และคลิกOpen
)
เมื่อเชื่อมต่อกับ Instance ได้แล้ว จะแสดงหน้าจอแบบนี้
Output
Using username "ec2-user".
Authenticating with public key "tinnakorn-test-eb"
_____ _ _ _ ____ _ _ _
| ____| | __ ___| |_(_) ___| __ ) ___ __ _ _ __ ___| |_ __ _| | | __
| _| | |/ _ \/ __| __| |/ __| _ \ / _ \/ _\ | '_ \/ __| __/ _\ | | |/ /
| |___| | (_| \__ \ |_| | (__| |_) | __/ (_| | | | \__ \ || (_| | | <
|_____|_|\__,_|___/\__|_|\___|____/ \___|\__,_|_| |_|___/\__\__,_|_|_|\_\
Amazon Linux 2023 AMI
This EC2 instance is managed by AWS Elastic Beanstalk. Changes made via SSH
WILL BE LOST if the instance is replaced by auto-scaling. For more information
on customizing your Elastic Beanstalk environment, see our documentation here:
http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.
html
, #_
~\_ ####_ Amazon Linux 2023
~~ \_#####\
~~ \###|
~~ \#/ ___ https://aws.amazon.com/linux/amazon-linux-2023
~~ V~' '->
~~~ /
~~._. _/
_/ _/
_/m/'
[ec2-user@ip-xx-xx-xx-xx ~]$
ตรวจสอบไฟล์ PHP ที่อัปโหลดใน Elastic Beanstalk
รันคำสั่งเข้าสู่ระบบผู้ใช้ระดับสูงสุดหรือ root (Superuser)
sudo su -
Output
[ec2-user@ip-xx-xx-xx-xx ~]$ sudo su -
[root@ip-xx-xx-xx-xx ~]#
รันคำสั่ง Update server ให้เป็นปัจจุบันเสมอ
yum update -y
รันคำสั่ง cd
เข้าไปที่โฟลเดอร์ /var/www/html/
cd /var/www/html/
Output
[root@ip-xx-xx-xx-xx ~]# cd /var/www/html/
[root@ip-xx-xx-xx-xx html]#
รันคำสั่งตรวจสอบไฟล์ index.php
ในโฟลเดอร์ html นี้
ll
Output
[root@ip-xx-xx-xx-xx html]# ll
total 4
-rw-r--r--. 1 webapp webapp 17 Mar 8 2024 info.php
[root@ip-xx-xx-xx-xx html]#
รันคำสั่งตรวจสอบข้อมูลในไฟล์ info.php
จะเห็นว่าแสดงตามที่เราสร้างไว้ (ถ้าต้องการออกจากหน้านี้ให้กดปุ่ม q
)
less info.php
Output
<?php
phpinfo();
info.php (END)
ติดตั้ง Client MariaDB
เมื่อติดตั้ง Client MariaDB จะทำให้สามารถเชื่อมต่อกับ RDS จาก Amazon Linux 2023 ได้ แต่ไม่สามารถใช้งาน MariaDB Server ได้ !
รันคำสั่งติดตั้ง Client MariaDB
yum install mariadb105 -y
ทดสอบเชื่อมต่อจาก Instance ไปยัง RDS
Instance ที่จะใช้เชื่อมต่อไปยัง RDS นี้ เป็น Instance ที่กำลังทำงานใน EC2 แต่ถูกสร้างมาจาก Elastic Beanstalk
อย่างไรก็ตาม สามารถเชื่อมต่อจาก Instance นี้ไปยัง RDS ได้เหมือนกับ Instance ที่สร้างด้วยตนเองใน EC2
รันคำสั่ง MySQL เชื่อมต่อจาก Instance ไปยัง RDS (ก่อนรันคำสั่งเปลี่ยนข้อมูลใน [ ] ให้เป็นของคุณ)
・Endpoint RDS: (-h [your_endpoint_rds])
・Master username: (-u admin)
・Master password: (-p[your_password_rds])
mysql -h [your_endpoint_rds] -u admin -p[your_password_rds]
Output
[root@ip-xx-xx-xx-xx html]# mysql -h tinnakorn-test-rds.xxxxxxxx.ap-southeast-1.rds.amazonaws.com -u admin -pPassW0rd
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 48
Server version: 8.0.35 Source distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]>
สร้าง Database
ผมจะทดสอบสร้าง Database ในฐานข้อมูล RDS โดยรันคำสั่งต่อไปนี้
ก่อนอื่นรันคำสั่งเรียกดูข้อมูลใน Database แล้วจะเห็นว่ามี Database เริ่มต้นของ RDS แสดงแบบนี้
show databases;
Output
MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.026 sec)
MySQL [(none)]>
รันคำสั่งสร้าง Database โดยเปลี่ยน database_name
เป็นชื่อ Database ที่ต้องการ (ตัวอย่างนี้ใช้ชื่อ tinnakorn
)
CREATE DATABASE database_name;
Output
MySQL [(none)]> CREATE DATABASE tinnakorn;
Query OK, 1 row affected (0.018 sec)
MySQL [(none)]>
รันคำสั่งเรียกดูข้อมูลใน Database อีกครั้ง จะเห็นว่ามีชื่อ Database ที่เราสร้างแสดงขึ้นมา
show databases;
Output
MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| tinnakorn |
+--------------------+
5 rows in set (0.001 sec)
MySQL [(none)]>
สร้าง Table
ผมจะทำการสร้าง Table ใน Database ที่ชื่อ tinnakorn
ที่สร้างจากขั้นตอนที่แล้ว
ก่อนอื่นรันคำสั่งเปลี่ยนฐานข้อมูลไปยัง Database ที่เราสร้างขึ้นมา เช่น tinnakorn
(เปลี่ยน "database_name" เป็นชื่อ DB ที่สร้างจากขั้นตอนที่แล้ว)
use database_name;
Output
MySQL [(none)]> use tinnakorn;
Database changed
MySQL [tinnakorn]>
รันคำสั่งสร้าง Table โดยเปลี่ยน table_name
เป็นชื่อ Table ที่ต้องการ (ตัวอย่างนี้ใช้ชื่อ test
)
create table table_name (id int, message varchar(255));
รันคำสั่งเพิ่มข้อมูลลงในตารางของฐานข้อมูล โดยเปลี่ยน table_name
เป็นชื่อ Table ที่สร้างจากขั้นตอนที่แล้ว (ตัวอย่างนี้จะเพิ่มข้อมูลลงใน Table ที่ชื่อ test
)
insert into table_name values (1, 'text1');
รันคำสั่งแสดงข้อมูลในตาราง โดยเปลี่ยน table_name
เป็นชื่อ Table ที่สร้างเมื่อสักครู่นี้ (ตัวอย่างนี้จะแสดงข้อมูลของ Table ที่ชื่อ test
)
select * from table_name;
Output
MySQL [tinnakorn]> select * from test;
+------+---------+
| id | message |
+------+---------+
| 1 | text1 |
+------+---------+
1 row in set (0.001 sec)
MySQL [tinnakorn]>
รันคำสั่งออกจากการเชื่อมต่อกับฐานข้อมูล RDS
quit
เมื่อเรามีข้อมูลใน Database แล้ว ให้ทำขั้นตอนถัดไปได้เลยครับ
Deploy PHP ใน Elastic Beanstalk
ก่อนหน้านี้เราได้แนะนำการ Deploy PHP ไปแล้ว อย่างไรก็ตาม หากต้องการแก้ไขหรือเพิ่มโปรเจกต์ เราสามารถทำได้โดย Deploy ในฟังก์ชัน Application versions ใน Environment ของเรา ซึ่งจะมาแนะนำในหัวข้อนี้ครับ
เราจะสร้างโปรแกรมที่ใช้ในการแสดงข้อมูล MySQL บนหน้าเว็บไซต์โดยเขียนลงในไฟล์ list.php
เพื่อให้สามารถตรวจสอบข้อมูลที่เราได้เพิ่มลงใน Table ได้ครับ
สร้างโปรแกรมที่ใช้แสดงข้อมูล MySQL บนหน้าเว็บไซต์
เราสามารถใช้โปรแกรมอะไรก็ได้ในการสร้างไฟล์ list.php
บนอุปกรณ์ของเรา แต่ครั้งนี้จะสร้างใน Notepad บน Windows
เปิด Notepad ขึ้นมา แล้วคัดลอก Code ด้านล่างนี้วางลงที่นี่
แล้วเปลี่ยนข้อมูล [$db_host, $db_name, $db_user, $db_password
] ให้เป็นของคุณ
・$db_host: Endpoint RDS (เมื่อสร้าง RDS เสร็จก็จะได้ Endpoint มาและให้ Copy Endpoint มาใส่ที่นี่)
・$db_name: Database Name RDS
・$db_user: Master username
・$db_password: Master password
<?php $db_host = '[your_endpoint_rds]'; $db_port = '3306'; $db_name = '[your_database_name]'; $db_user = 'admin'; $db_password = '[your_password_rds]'; $con = mysqli_connect($db_host, $db_user, $db_password, $db_name); $con->set_charset('utf8mb4'); $sql = "SELECT * FROM test"; if ($result = mysqli_query($con, $sql)) { while ($obj = mysqli_fetch_object($result)) { echo "$obj->id $obj->message<br>\n"; } mysqli_free_result($result); } mysqli_close($con); ?>
แล้ว Save ไฟล์ list.php
เหมือนกับขั้นตอนของ info.php ก่อนหน้านี้ แล้วจะแสดงตามรูปภาพแบบนี้
Compress to ZIP file
จากนั้นปิด Notepad ไปได้เลย แล้วใช้เมาส์ลากครอบไฟล์ [info.php
และ list.php
] แล้วคลิกขวาที่ไฟล์ใดไฟล์หนึ่ง
แล้วเลือก Compress to ZIP file
เพื่อบีบอัดทั้ง 2 ไฟล์เข้าด้วยกัน
*ครั้งนี้ต้องบีบอัดเข้าด้วยกันทั้ง 2 ไฟล์ เพราะถ้า Deploy ไปแล้ว ไฟล์ "info.php" ที่อัปโหลดไปก่อนหน้านั้นจะถูกลบไปครับ
แล้วจะแสดงแบบนี้ ถ้าไฟล์เป็นชื่อ "list.zip" หรือ "info.zip" ก็ไม่เป็นไร เพราะชื่อจะถูกสร้างตามเม้าส์ที่เราชี้ไฟล์นั้นก่อนบีบอัดครับ
แล้วเปลี่ยนชื่อไฟล์ ZIP เป็นวันที่และเวลาปัจจุบันเพื่อให้ง่ายต่อการดู Application versions เช่น 20240308_1600.zip
แล้วคลิกเข้ามาที่ไฟล์ก็จะแสดงแบบนี้
เมื่อเตรียมไฟล์สำหรับ Deploy เสร็จแล้ว เริ่มทำขั้นตอนถัดไปได้เลยครับ
Deploy PHP ไปยัง Elastic Beanstalk ที่กำลังทำงานอยู่
Deploy PHP โดยใช้ไฟล์ zip
ที่บีบอัดไว้เมื่อสักครู่นี้ไปยัง Elastic Beanstalk ที่กำลังทำงานอยู่
คลิก Environment: Your environment name
และเลือก Application versions
ใน "▼ Application: Your environment name"
หัวข้อ Upload Application Version
・Version label: 20220707_1457
(แนะนำให้ใส่ชื่อเดียวกับไฟล์ .zip
ที่บีบอัดไว้เมื่อสักครู่นี้)
・คลิก Choose file
แล้วเลือกไฟล์จากที่เก็บไฟล์ของเรา ครั้งนี้ไฟล์ ZIP อยู่ใน Desktop แล้วคลิก Open
แล้วจะแสดง [✅ File name: 20240308_1435.zip] แบบนี้ แล้วเปลี่ยนชื่อเวอร์ชันในช่อง Version label ตามต้องการ แล้วคลิก Upload
(แนะนำให้ป้อนเป็นชื่อเดียวกับไฟล์ .zip
ที่บีบอัดไว้ก่อนหน้านี้)
ติ๊ก Version label ที่จะ Deploy แล้วคลิก Actions
และเลือก Deploy
เลือก Environment
แล้วคลิก Deploy
แล้วรอสักครู่ และ Reload แล้วดูที่ Deployed to จะเห็นว่าชื่อ Environment ของเราเลื่อนมาอยู่แถวเดียวกับเวอร์ชันล่าสุดแล้ว
ตรวจสอบ Events
ต่อไปคลิก Your environment name
ใน "▼ Recent environments" จากเมนูด้านซ้าย
แล้วดูที่ช่อง Platform จะเห็นว่า Running version เป็นชื่อเวอร์ชันที่เรากำหนดไว้
และดูที่ช่อง Details ในแท็บ Events จะเห็นว่ามีการเริ่มต้นและเสร็จสิ้นการ Deploy
ทดสอบแสดงหน้าเว็บไซต์หลัง Deploy
ให้ตรวจสอบหน้าเว็บไซต์ด้วย path info.php
(หน้า phpinfo) และ list.php
(หน้าแสดงผลข้อมูล MySQL)
กลับมาที่หน้าเว็บไซต์ phpinfo ของไฟล์ info.php
แล้ว Reload อีกครั้ง จะเห็นว่าสามารถแสดง phpinfo ได้เหมือนเดิม
ต่อไปทดสอบไฟล์ /list.php
โดยเปลี่ยนเป็น URL เป็น path ด้านล่างนี้
http://[Domain Elastic Beanstalk]/list.php
แล้วจะแสดงหน้าข้อมูล MySQL ที่เพิ่มลงใน Table "test" แบบนี้
ตรวจสอบ Application ที่ Deploy แล้ว
ตรวจสอบไฟล์ PHP ที่ Deploy ใน PuTTY
กลับมาที่หน้าจอ PuTTY แล้วรันคำสั่ง cd
เข้าไปที่โฟลเดอร์ /var/www/html
*ทุกครั้งที่มีการ Deploy โปรเจกต์ Path "/var/www/html" จะถูกลบและรีเซ็ตใหม่ทุกครั้ง
cd /var/www/html/
Output
[root@ip-xx-xx-xx-xx html]# cd /var/www/html/
[root@ip-xx-xx-xx-xx html]#
รันคำสั่งตรวจสอบไฟล์ที่ Deploy ไปยัง Elastic Beanstalk ใน html
ll
Output
[root@ip-xx-xx-xx-xx html]# ll
total 8
-rw-r--r--. 1 webapp webapp 17 Mar 8 2024 info.php
-rw-r--r--. 1 webapp webapp 521 Mar 8 2024 list.php
[root@ip-xx-xx-xx-xx html]#
รันคำสั่งตรวจสอบข้อมูลในไฟล์ list.php
จะเห็นว่าแสดงตามที่เราสร้างไว้ (ถ้าต้องการออกจากหน้านี้ให้กดปุ่ม q
)
less list.php
Output
set_charset('utf8mb4');
$sql = "SELECT * FROM test";
if ($result = mysqli_query($con, $sql)) {
while ($obj = mysqli_fetch_object($result)) {
echo "$obj->id $obj->message
\n";
}
mysqli_free_result($result);
}
mysqli_close($con);
?>
list.php (END)
ทดสอบผลการ Deploy PHP
เพิ่มข้อมูลลงใน Table
ผมจะเพิ่มข้อมูล [id:
2
, message:text2
| id:3
, message:text3
] ลงใน Table "test" อีกครั้ง
รันคำสั่ง MySQL เชื่อมต่อจาก Instance ไปยัง RDS อีกครั้ง (ก่อนรันคำสั่งเปลี่ยนข้อมูลใน [ ] ให้เป็นของคุณ)
・Endpoint RDS: (-h [your_endpoint_rds])
・Master username: (-u admin)
・Master password: (-p[your_password_rds])
・Database Name: ([your_database_name])
mysql -h [your_endpoint_rds] -u admin -p[your_password_rds] tinnakorn
Output
[root@ip-xx-xx-xx-xx html]# mysql -h tinnakorn-test-rds.xxxxxxxx.ap-southeast-1.rds.amazonaws.com -u admin -pPassW0rd tinnakorn
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 32
Server version: 8.0.35 Source distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [tinnakorn]>
รันคำสั่งเพิ่มข้อมูล [id: 2
, message: text2
| id: 3
, message: text3
] ลงใน Table "test" และแสดงผลข้อมูล (สามารถรันคำสั่งพร้อมกันได้เลย)
insert into test values (2, "text2"); insert into test values (3, "text3"); select * from test;
Output
MySQL [tinnakorn]> insert into test values (2, "text2");
Query OK, 1 row affected (0.005 sec)
MySQL [tinnakorn]> insert into test values (3, "text3");
Query OK, 1 row affected (0.005 sec)
MySQL [tinnakorn]> select * from test;
+------+---------+
| id | message |
+------+---------+
| 1 | text1 |
| 2 | text2 |
| 3 | text3 |
+------+---------+
3 rows in set (0.001 sec)
MySQL [tinnakorn]>
ทดสอบแสดงผลหน้าเว็บไซต์หลังเพิ่มข้อมูลลงใน Table
กลับมาที่หน้าเว็บไซต์แล้ว Reload อีกครั้ง จะเห็นว่ามีข้อมูล [2 text2
และ 3 text3
] เพิ่มขึ้นมา
เพียงเท่านี้ก็สามารถ Deploy ไฟล์ [info.php
และ list.php
] ไปยัง Elastic Beanstalk และแสดงข้อมูลตามที่เพิ่มลงใน Table ของ Database RDS ได้แล้วครับ
ลบ AWS Resource ที่สร้างขึ้นในบทความนี้
ลบเรียงตาม AWS Resource ดังนี้
- RDS
- Databases
- Elastic Beanstalk
- Environments (Terminate)
- Applications
- Amazon EC2
- Key Pairs
- Security Groups (RDS)
- Security Groups (Elastic Beanstalk)
ลบ RDS
ดูตัวอย่างที่นี่เฉพาะหัวข้อหลักนี้: วิธีการลบ RDS
ลบ Environments และ Applications ใน Elastic Beanstalk
ดูตัวอย่างที่นี่เฉพาะหัวข้อย่อยนี้: การลบ Environments และ Applications ใน Elastic Beanstalk
ลบ Key Pair และ Security Groups ใน Amazon EC2
ดูตัวอย่างได้ที่ลิงก์ด้านล่างนี้
สรุป
การสาธิตนี้เราได้ Deploy PHP (ไฟล์ info.php
และ list.php
) ไปยัง Elastic Beanstalk แล้วเชื่อมต่อกับ RDS และเพิ่มข้อมูลใน Database แล้วทดสอบการแสดงผลข้อมูลที่เพิ่มลงใน Database ด้วยไฟล์ list.php
บนหน้าเว็บไซต์
ผมหวังว่าบทความนี้จะเป็นประโยชน์ให้กับผู้อ่านได้นะครับ
POP (Tinnakorn Maneewong) จากบริษัท Classmethod (Thailand) ครับ !
บทความที่เกี่ยวข้อง
- สร้าง Service role และ Instance profile ที่ใช้สำหรับ Elastic Beanstalk ใน IAM
- [Update] วิธีการสร้าง RDS และเชื่อมต่อจาก EC2 บน AWS
- วิธีติดตั้ง Amazon Linux 2023 บน EC2 และเชื่อมต่อเซิร์ฟเวอร์ด้วยโปรแกรม PuTTY
- [Update] ทดลองเริ่มต้นใช้งาน Sample Elastic Beanstalk ด้วย PHP
- การ Terminate Instance, ลบ Key Pair และลบ Security Group ใน EC2